package br.ufpe.cin.ip.biblioteca.util;

import br.ufpe.cin.ip.biblioteca.entidades.Funcionario;
import br.ufpe.cin.ip.biblioteca.entidades.Publicacao;
import br.ufpe.cin.ip.biblioteca.entidades.Usuario;

public class QuickSort {
	public static void sort(Funcionario[] funcionarios, String campo) {
		if(funcionarios!=null && funcionarios.length>1)
			QuickSort.quickSort(funcionarios, 0, funcionarios.length-1, campo);
	}
	
	public static void sort(Publicacao[] publicacoes, String campo) {
		if(publicacoes!=null && publicacoes.length>1)
			QuickSort.quickSort(publicacoes, 0, publicacoes.length-1, campo);
	}
	
	public static void sort(Usuario[] usuarios, String campo) {
		if(usuarios!=null && usuarios.length>1)
			QuickSort.quickSort(usuarios, 0, usuarios.length-1, campo);
	}
	
	private static void quickSort(Funcionario[] funcionarios, int inicio, int fim, String campo) {
		int meio;
		
		if(inicio<fim) {
			meio = QuickSort.partition(funcionarios, inicio, fim, campo);
			QuickSort.quickSort(funcionarios, inicio, meio, campo);
			QuickSort.quickSort(funcionarios, meio + 1, fim, campo);
		}
	}
	
	private static void quickSort(Publicacao[] publicacoes, int inicio, int fim, String campo) {
		int meio;
		
		if(inicio<fim) {
			meio = QuickSort.partition(publicacoes, inicio, fim, campo);
			QuickSort.quickSort(publicacoes, inicio, meio, campo);
			QuickSort.quickSort(publicacoes, meio + 1, fim, campo);
		}
	}
	
	private static void quickSort(Usuario[] usuarios, int inicio, int fim, String campo) {
		int meio;
		
		if(inicio<fim) {
			meio = QuickSort.partition(usuarios, inicio, fim, campo);
			QuickSort.quickSort(usuarios, inicio, meio, campo);
			QuickSort.quickSort(usuarios, meio + 1, fim, campo);
		}
	}
	
	private static int partition(Funcionario[] funcionarios, int inicio, int fim, String campo) {
		Funcionario pivo = funcionarios[inicio];
		int topo = inicio;
		
		for(int i=inicio+1; i<=fim; i++) {
			boolean comparation = false;
			
			if(campo.equalsIgnoreCase("login")) {
				comparation = funcionarios[i].getLogin().compareTo(pivo.getLogin()) < 0;
			} else if(campo.equalsIgnoreCase("nome")) {
				comparation = funcionarios[i].getNome().compareTo(pivo.getNome()) < 0;
			} else {
				comparation = funcionarios[i].getMatricula().compareTo(pivo.getMatricula()) < 0;
			}
				
			if(comparation) {
				funcionarios[topo] = funcionarios[i];
				funcionarios[i] = funcionarios[topo + 1];
				topo++;
			}
		}
		
		funcionarios[topo] = pivo;
		return topo;
	}
	
	private static int partition(Publicacao[] publicacoes, int inicio, int fim, String campo) {
		Publicacao pivo = publicacoes[inicio];
		int topo = inicio;
		
		for(int i=inicio+1; i<=fim; i++) {
			boolean comparation = false;
			
			if(campo.equalsIgnoreCase("titulo")) {
				comparation = publicacoes[i].getTitulo().compareTo(pivo.getTitulo()) < 0;
			} else if(campo.equalsIgnoreCase("local")) {
				comparation = publicacoes[i].getLocal().compareTo(pivo.getLocal()) < 0;
			} else {
				comparation = publicacoes[i].getId()<pivo.getId();
			}
				
			if(comparation) {
				publicacoes[topo] = publicacoes[i];
				publicacoes[i] = publicacoes[topo + 1];
				topo++;
			}
		}
		
		publicacoes[topo] = pivo;
		return topo;
	}
	
	private static int partition(Usuario[] usuarios, int inicio, int fim, String campo) {
		Usuario pivo = usuarios[inicio];
		int topo = inicio;
		
		for(int i=inicio+1; i<=fim; i++) {
			boolean comparation = false;
			
			if(campo.equalsIgnoreCase("nome")) {
				comparation = usuarios[i].getNome().compareTo(pivo.getNome()) < 0;
			} else if(campo.equalsIgnoreCase("rg")) {
				comparation = usuarios[i].getRG().compareTo(pivo.getRG()) < 0;
			} else {
				comparation = usuarios[i].getMatricula().compareTo(pivo.getMatricula()) < 0;
			}
				
			if(comparation) {
				usuarios[topo] = usuarios[i];
				usuarios[i] = usuarios[topo + 1];
				topo++;
			}
		}
		
		usuarios[topo] = pivo;
		return topo;
	}
}
